/**
 * 订阅者
 *  当数据发生变化触发依赖，dep 通知所有的 watcher 实例更新视图
 *  自身实例化的时候往 dep 对象中添加自己
 */
class Watcher {
  
  constructor (vm, key, callback) {
    this.vm = vm
    // data 中的属性名称
    this.key = key
    // 回调函数，负责更新视图
    this.callback = callback

    // 把 watcher 对象记录到 dep 类的静态属性 target 
    Dep.target = this
    // 当访问属性的时候，就会触发 get 方法，在 get 方法中会调用 addSub    
    this.oldValue = vm[key]
    // 记录完以后就把 target 属性赋值空，以防覆盖
    Dep.target = null
  }

  /**
   * 当数据发生变化的时候更新视图
   */
  update () {
    let newValue = this.vm[this.key]
    if (this.oldValue === newValue) {
      return
    }
    this.callback(newValue)
  }
}